/**
 * 通用uni-app网络请求
 * 基于 Promise 对象实现更简单的 request 使用方式，支持请求和响应拦截
 */

/*
// 开放的接口
import http from './interface'

http.config.baseUrl = "http://localhost:8080/api/"

http.request(url:'user/list',method:'GET').then((res)=>{
	console.log(JSON.stringify(res))
})
http.get('user/list').then((res)=>{
	console.log(JSON.stringify(res))
})
http.get('user/list', {status: 1}).then((res)=>{
	console.log(JSON.stringify(res))
})
http.post('user', {id:1, status: 1}).then((res)=>{
	console.log(JSON.stringify(res))
})
http.put('user/1', {status: 2}).then((res)=>{
	console.log(JSON.stringify(res))
})
http.delete('user/1').then((res)=>{
	console.log(JSON.stringify(res))
}) 

*/
function getAuth() {
    let authInfo = uni.getStorageSync('authInfo');
    return {
        'Content-Type':'application/json;charset=UTF-8',
        'Authorization':authInfo.tokenHead+authInfo.token
    }; 
}

export default {
	config: {
		// baseUrl: "http://192.168.0.214:9090/",
		baseUrl: "https://online.cdkingint.com/onlinex/",
		// baseUrl: "http://192.168.0.156:9090/",
		header: {
			'Content-Type':'application/json;charset=UTF-8',
			// 'Content-Type':'application/x-www-form-urlencoded'
		},  
		data: {},
		method: "GET",
		dataType: "json",  /* 如设为json，会对返回的数据做一次 JSON.parse */
		responseType: "text",
		success() {},
		fail() {},
		complete() {}
	},
	interceptor: {
		request: null,
		response: null
	},
	request(options) {
		if (!options) {
			options = {}
		}
        if(options.urlType=="pay"){//支付接口没有统一api/的处理
            options.baseUrl = (this.config.baseUrl).replace(/api\//,"");
            // console.log((this.config.baseUrl).replace(/api\//,""));
            // console.log(options.baseUrl)
        }else{
            options.baseUrl = options.baseUrl || this.config.baseUrl;
		}
		options.dataType = options.dataType || this.config.dataType;
		options.url = options.baseUrl + options.url;
		options.data = options.data || {};
		options.method = options.method || this.config.method;
		options.header = options.header=='h'?getAuth():this.config.header;
		//TODO 加密数据
		
		//TODO 数据签名
		/* 
		_token = {'token': getStorage(STOREKEY_LOGIN).token || 'undefined'},
		_sign = {'sign': sign(JSON.stringify(options.data))}
		options.header = Object.assign({}, options.header, _token,_sign) 
		*/
        // uni.showLoading({
        //     title: '加载中'
        // });
		return new Promise((resolve, reject) => {
			let _config = null
			
			options.complete = (response) => {
                // uni.hideLoading();
				let code = response.data.code;
				let statusCode = response.statusCode;
				if(code === 402 || response.data.message == '请先登录'){
					uni.removeStorageSync('authInfo');
					 uni.removeStorageSync('wxUserInfo');
					uni.navigateTo({
						url:'/pages/public/login_choose'
					})
				}
				response.config = _config;
				if (process.env.NODE_ENV === 'development') {
					if (statusCode === 200) {
						// console.log("【" + _config.requestId + "】 结果：" + JSON.stringify(response.data))
					}
				}
				if (this.interceptor.response) {
					let newResponse = this.interceptor.response(response)
					if (newResponse) {
						response = newResponse
					}
				}
				// 统一的响应日志记录
				_reslog(response)

				if (statusCode === 200) { //成功
                    let wxUserInfo = uni.getStorageSync('wxUserInfo');
                    if(!wxUserInfo){
                        // 获取用户信息
                        uni.getUserInfo({
                            provider: 'weixin',
                            success: function (infoRes) {
                            	// console.log(infoRes)
                                uni.setStorageSync('wxUserInfo', infoRes.userInfo);
                            }
                        });
                    }
                    if(response.data.code==401){
                        uni.removeStorageSync('authInfo');
                        uni.removeStorageSync('wxUserInfo');
                       uni.navigateTo({
						   url:'/pages/public/login_choose'
					   })
                    }
                    else if(response.data.code==200){
                        resolve(response);
					}else{
						reject(response)
                        uni.showToast({title:response.data.msg?response.data.msg:'操作失败',icon:"none",duration:2500,mask:true});
					}

				} else {
                    uni.showToast({title:response.data?response.data.message:'连接失败',image:"/static/warn.png",duration:2500,mask: true});
                    return false;
					// reject(response)
				}
			}

			_config = Object.assign({}, this.config, options)
			_config.requestId = new Date().getTime()

			if (this.interceptor.request) {
				this.interceptor.request(_config)
			}
			
			// 统一的请求日志记录
			_reqlog(_config)

			if (process.env.NODE_ENV === 'development') {
				// console.log("【" + _config.requestId + "】 地址：" + _config.url)
				if (_config.data) {
					// console.log("【" + _config.requestId + "】 参数：" + JSON.stringify(_config.data))
				}
			}

			uni.request(_config);
		});
	},
	get(url, data, options) {
		if (!options) {
			options = {}
		}
		options.url = url
		options.data = data
		options.method = 'GET'  
		return this.request(options)
	},
	post(url, data, options) {
		if (!options) {
			options = {}
		}
		options.url = url
		options.data = data
		options.method = 'POST'
		return this.request(options)
	},
	put(url, data, options) {
		if (!options) {
			options = {}
		}
		options.url = url
		options.data = data
		options.method = 'PUT'
		return this.request(options)
	},
	delete(url, data, options) {
		if (!options) {
			options = {}
		}
		options.url = url
		options.data = data
		options.method = 'DELETE'
		return this.request(options)
	}
}


/**
 * 请求接口日志记录
 */
function _reqlog(req) {
	if (process.env.NODE_ENV === 'development') {
		// console.log("【" + req.requestId + "】 地址：" + req.url)
		if (req.data) {
			// console.log("【" + req.requestId + "】 请求参数：" + JSON.stringify(req.data))
		}
	}
	//TODO 调接口异步写入日志数据库
}

/**
 * 响应接口日志记录
 */
function _reslog(res) {
	let _statusCode = res.statusCode;
	if (process.env.NODE_ENV === 'development') {
		// console.log("【" + res.config.requestId + "】 地址：" + res.config.url)
		if (res.config.data) {
			// console.log("【" + res.config.requestId + "】 请求参数：" + JSON.stringify(res.config.data))
		}
		// console.log("【" + res.config.requestId + "】 响应结果：" + JSON.stringify(res))
	}
	//TODO 除了接口服务错误外，其他日志调接口异步写入日志数据库
	switch(_statusCode){
		case 200:
			break;
		case 401:
			break;
		case 404:
			break;
		default:
			break;
	}
}

